#ifndef COMMDEF_H
#define COMMDEF_H

#include <string.h>
#include <stdint.h>

// 日志级别
// 日志一共分成八个等级【级别从高到低，数字最小的级别最高，数字大的级别最低】，以方便管理、显示、过滤等等
#define LOG_STDERR            0    //控制台错误【stderr】：最高级别日志，日志的内容写入log参数指定的文件，同时也尝试直接将日志输出到标准错误设备比如控制台屏幕
#define LOG_EMERG             1    //紧急 【emerg】
#define LOG_ALERT             2    //警戒 【alert】
#define LOG_CRIT              3    //严重 【crit】
#define LOG_ERR               4    //错误 【error】：属于常用级别
#define LOG_WARN              5    //警告 【warn】：属于常用级别
#define LOG_NOTICE            6    //注意 【notice】
#define LOG_INFO              7    //信息 【info】
#define LOG_DEBUG             8    //调试 【debug】：最低级别

#define ERROR_LOG_PATH       "error.log"   //定义日志存放的路径和文件名 
#define LOG_LINE_TITLE "GameServer: "
#define LOG_LINE_TITLE_LEN 12

#define MAX_ERROR_STR 2048
#define copymem(dst, src, n) (((u_char *)memcpy(dst, src, n)) + (n))

#define MAX_UINT32_VALUE (uint32_t) 0xffffffff          //最大的32位无符号数：十进制是‭4294967295‬
#define INT64_LEN (sizeof("-9223372036854775808") - 1)

//标记当前进程类型
#define PROCESS_MASTER     0  //master进程，管理进程
#define PROCESS_WORKER     1  //worker进程，工作进程

//和数据包相关的定义
#define PKG_MAX_LENGTH	30000	//每个包的最大长度[包头+包体]不超过这个数字，为了留出一些空间，实际上是包头+包体长度必须不大于这个值-1000(29000)

//通信，收包状态定义
#define PKG_HD_INIT	0		//初始状态，准备接收数据包头
#define PKG_HD_RECVING 1	//接收包头中，包头不完整，继续接收中
#define PKG_BD_INIT 2		//包头刚好收完，准备接收包体
#define PKG_BD_RECVING 3	//接收包体中，包体不完整，继续接收中，处理后直接回到PKG_HD_INIT状态

#define HEADER_BUFFSIZE 20		//包头长度大小	，因为要收包头，要定义一个固定大小的字符串数组，这里用20作为字符串数组大小绰绰有余

//包头结构定义
#pragma pack(1)				//对齐方式，1字节对齐[结构成员之间不做任何字节对齐，紧密的排列在一起]

//包头结构
typedef struct PkgHeader {
	unsigned short pkgLen;	//报文总长度【包头+包体】
	unsigned short msgCode;	//消息类型代码，用于区别每个不同的命令【不同的消息】
	uint64_t crc32;				//CRC32校验，为了防止收发数据中出现收到内容和发送内容不一致的情况
} PkgHeader, *LPPkgHeader;

#pragma pack()

#endif
